package com.llu.serial.fastjson.deserializer;


import com.llu.serial.fastjson.FieldInfo;
import com.llu.serial.fastjson.JsonConfig;
import com.llu.serial.fastjson.Utils;
import org.json.JSONArray;
import org.json.JSONObject;


import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class JavabeanDeserializer implements ObjectDeserializer {

    private final Class<?> beanType;
    private final List<FieldInfo> fieldInfos;

    public JavabeanDeserializer(Class<?> clazz){
        this.beanType = clazz;
        Map<String, Field> fieldCacheMap = new HashMap<>();
        Utils.parserAllFieldToCache(fieldCacheMap,beanType);
        fieldInfos = Utils.computeSetters(beanType,fieldCacheMap);
    }

    @Override
    /**
     * 根据给定的Json配置、JSON字符串和对象，反序列化出一个对应的Java对象
     *
     * @param config Json配置对象，用于定制反序列化行为
     * @param json 要反序列化的JSON字符串
     * @param object 可能是JSONObject或null，如果非null，则尝试重用此对象进行反序列化
     * @return 反序列化后的Java对象
     * @throws Throwable 反序列化过程中可能抛出的异常
     */
    public <T> T deserializer(JsonConfig config, String json, Object object) throws Throwable {
        // 初始化JSONObject，如果object为null，则从json字符串新建，否则直接使用object
        JSONObject jsonObject = null;
        if(null == object){
            jsonObject = new JSONObject(json);
        } else {
            jsonObject = (JSONObject) object;
        }

        // 尝试创建T类型的实例
        T t = null;
        try{
            t = (T) beanType.newInstance();
        }catch (Exception e){
            e.printStackTrace();
        }
        // 示例JSON字符串，实际使用时应替换为传入的json参数
        // {"age":100,"name":"testname","test":1,"list":["1","2"]}

        // 遍历所有FieldInfo，为T类型的每个字段尝试从json中获取值
        for(FieldInfo fieldInfo : fieldInfos){
            // 如果json数据中没有对应的key，则跳过当前字段
            if(!jsonObject.has(fieldInfo.name)){
                continue;
            }

            Object value = jsonObject.get(fieldInfo.name);

            // 如果值是JSONObject或JSONArray，使用特定的反序列化器进行处理
            if(value instanceof JSONObject || value instanceof JSONArray){
                ObjectDeserializer deserializer = config.getDeserializer(fieldInfo.genericType);
                Object obj = deserializer.deserializer(config, null, value);
                fieldInfo.set(t, obj);
            } else {
                // 对于其他类型的价值，直接设置值，但需排除JSONObject.NULL
                if(value != JSONObject.NULL){
                    fieldInfo.set(t, value);
                }
            }
        }

        return t;
    }



}
